﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Studio7i.Dominio;
using Studio7i.Persistencia;

namespace Studio7i.Pruebas
{
    public class TestServicioDAO
    {

        [TestFixture]
        public class Test1_servicioDAO
        {
            // Atributos a utilizar durante las pruebas
            private ServicioDAO servicioDAO = null;
            private int codigoGenerado = 0;

            [TestFixtureSetUp]
            public void PrepararPruebas()
            {
                // 1. Definimos la implementación del DAO a probar (ADO / NH / EF)
                servicioDAO = new Persistencia.ServicioDAO();

                // 2. Eliminamos todos los servicios en BD antes de las pruebas
                foreach (Servicio servicio in servicioDAO.ListarTodos())
                    servicioDAO.Eliminar(servicio);

                // 3. Creamos 1 servicio para tenerlos disponibles en las pruebas
                servicioDAO.Crear(new Servicio() { CodServ = 1, Descripcion = "Aire Acondicionado", CostoHora = 10 });
              
            }

            [Test]
            public void Test1_Crear()
            {
                // 1. Clase a probar: ServicioDAO
                Assert.IsNotNull(servicioDAO);

                // 2. Declaramos e instanciamos la entidad de dominio
                Servicio servicioACrear = new Servicio();
                servicioACrear.CodServ = 1;
                servicioACrear.Descripcion = "grabacion digital";
                servicioACrear.CostoHora = 12;
                             

                // 3. Declaramos la entidad que contendrá el resultado
                Servicio servicioCreado = null;

                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    servicioCreado = servicioDAO.Crear(servicioACrear);
                    codigoGenerado = servicioCreado.CodServ;
                }, "servicio creado");

                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(servicioCreado);
                // Probamos que el código generado sea mayor a 0
                Assert.Greater(servicioCreado.CodServ, 0);
                // Probamos que la descripcion registrado es igual al solicitado con la entidad
                Assert.AreEqual(servicioCreado.Descripcion, servicioACrear.Descripcion);
                // Probamos que el csoto x hora registrado es igual al solicitado con la entidad
                Assert.AreEqual(servicioCreado.CostoHora, servicioACrear.CostoHora);

            }

            [Test]
            public void Test2_Obtener()
            {
                // 1. Clase a probar: ServicioDAO
                Assert.IsNotNull(servicioDAO);
                // 2. Definimos los datos para la prueba
                int codigo = codigoGenerado;
                // 3. Declaramos la entidad que contendrá el resultado
                Servicio servicioObtenido = null;
                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    servicioObtenido = servicioDAO.Obtener(codigo);
                });

                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(servicioObtenido);
                Assert.AreEqual(servicioObtenido.CodServ, codigo);
                Assert.IsNotNullOrEmpty(servicioObtenido.Descripcion);
                //Assert.IsNotNullOrEmpty(servicioObtenido.CostoHora);

            }

            [Test]
            public void Test3_Modificar()
            {
                // 1. Clase a probar: ServicioDAO
                Assert.IsNotNull(servicioDAO);

                // 2. Declaramos e instanciamos la entidad de dominio a modificar
                Servicio servicioAModificar = new Servicio();
                servicioAModificar.CodServ = 1;
                servicioAModificar.Descripcion = "microfono";
                servicioAModificar.CostoHora = 15;
               
                // 3. Declaramos la entidad que contendrá el resultado
                Servicio servicioModificado = null;

                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    servicioModificado = servicioDAO.Modificar(servicioAModificar);
                }, "servicio modificado");
                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(servicioModificado);
                // Probamos que el código generado sea mayor a 0
                Assert.AreEqual(servicioModificado.CodServ, 1);
                // Probamos que la descripcion registrado es igual al solicitado con la entidad
                Assert.AreEqual(servicioModificado.Descripcion, servicioAModificar.Descripcion);

            }

            [Test]
            public void Test4_Eliminar()
            {
                // 1. Clase a probar: servicioDAO
                Assert.IsNotNull(servicioDAO);

                // 2. Declaramos e instanciamos la entidad de dominio a eliminar
                codigoGenerado = 1;
                Servicio servicioAEliminar = servicioDAO.Obtener(codigoGenerado);

                // 3. Declaramos la entidad que contendrá el resultado
                Servicio servicioEliminado = null;

                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    servicioDAO.Eliminar(servicioAEliminar);
                }, "servicio eliminado");

                // Probamos que la entidad resultante no sea nula
                Assert.IsNull(servicioEliminado);

            }
        }
    }
}